// import router from './router'
// import store from './store'
// import { Message } from 'element-ui'
// import NProgress from 'nprogress' // progress bar
// import 'nprogress/nprogress.css' // progress bar style
// import { getToken } from '@/utils/auth' // get token from cookie
// import getPageTitle from '@/utils/get-page-title'

// NProgress.configure({ showSpinner: false }) // NProgress Configuration

// const whiteList = ['/login', '/404'] // whiteList白名单,不需要登录就可以访问的界面

// // 全局前置守卫
// router.beforeEach(async(to, from, next) => {
//   // start progress bar
//   NProgress.start()

//   // set page title
//   document.title = getPageTitle(to.meta.title)

//   // 得到token
//   const hasToken = getToken()

//   // 判断有没有token
//   if (hasToken) {
//     // 有token的情况(用户已经登录)
//     if (to.path === '/login') {
//       // 用户已经登录,跳转到首页
//       next({ path: '/' })
//       NProgress.done()
//     } else {
//       // 登陆了,访问的非登录页
//       // 获取用户信息
//       const hasGetUserInfo = store.getters.name
//       if (hasGetUserInfo) {
//         // 有用户信息放行
//         next()
//       } else {
//         try {
//           // 带着token,重新获取用户信息
//           await store.dispatch('user/getInfo')
//           next()
//         } catch (error) {
//           // token失效了,跳转login重新登录
//           await store.dispatch('user/resetToken')
//           Message.error(error || 'Has Error')
//           next(`/login?redirect=${to.path}`)
//           NProgress.done()
//         }
//       }
//     }
//   } else {
//     // 没有token
//     if (whiteList.indexOf(to.path) !== -1) {
//       // 用户没登录,访问的白名单中的地址,放行
//       next()
//     } else {
//       // 用户没登录,访问不是白名单中的地址,跳转到登录,让其登陆完之后访问该地址
//       next(`/login?redirect=${to.path}`)
//       NProgress.done()
//     }
//   }
// })

// router.afterEach(() => {
//   // finish progress bar
//   NProgress.done()
// })

// 拿到动态路由数组
import router, { asyncRoutes } from '@/router'
import store from '@/store'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

const whiteList = ['/login', '/404'] // 定义白名单  所有不受权限控制的页面

router.beforeEach(async (to, from, next) => {
  NProgress.start()
  const token = store.getters.token
  if (token) {
    // 有token
    if (to.path === '/login') {
      next('/')
      NProgress.done()
    } else {
      // 正常放行, 正常访问首页等内部页面, 需要获取用户信息
      // 如果当前vuex中已经有用户资料了, 就不需要再获取了 (没必要重复获取资料)
      if (Object.keys(store.state.user.userInfo).length === 0) {
        // 好处:可以及时获取权限
        // 1,先筛选出符合条件的路由规则
        const {
          data: {
            roles: { menus }
          }
        } = await store.dispatch('user/getUserInfo')
        // console.log(menus) 权限菜单name数组
        const otherRoules = asyncRoutes.filter(item => {
          return menus.includes(item.children[0].name)
        })

        store.commit('permission/setRoutes', otherRoules)
        // 2,动态添加符合条件的路由规则
        // router.addRoutes(添加动态路由)
        // addRoutes是异步的,不会影响next()的执行,需要让next()在最后执行
        router.addRoutes([...otherRoules, { path: '*', redirect: '/404', hidden: true }])
        next({
          // 在next中加一些配置项,会形成一个死循环,会等到addRoutes执行完了之后,自动跳出循环
          ...to, // next({ ...to })的目的,是保证路由添加完了再进入页面 (可以理解为重进一次)
          replace: true // 重进一次, 不保留重复历史
        })
        return
      }
      next()
    }
  } else {
    // 没token
    // 看在不在白名单中(免登陆即可访问的页面)
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login')
      NProgress.done()
    }
  }
})
// 导航后置守卫(加载完成)
router.afterEach((to, from) => {
  NProgress.done()
})
